package com.cy.pj.common.pool;

import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Scope("prototype")//prototype表示多例作用域，此类实例与lazy无关，默认何时需要何时创建，并且不会存储到spring的容器
//用于定义对象作用域，默认为单例singleton作用域（一个JVM内存中名字相同的bean只能有一个，也就是key相同的bean）
//@Lazy//描述的类的对象可以延迟创建，何时需要何时创建（按需加载）
@Component
public class ObjectPool {//假设此对象为一个对象池
    public ObjectPool(){//假设运行项目启动类，此构造方法执行了，说明此类对象创建了
        System.out.println("ObjectPool()...");
    }
    @PostConstruct//生命周期初始化方法，对象构建后执行
    public void init(){
        System.out.println("init()..");
    }
    @PreDestroy //生命周期销毁方法，此方法所在的对象，假如存储到了spring容器，就会执行此方法，而prototype多例作用域对象不执行此方法，对象销毁前执行
    public void destroy(){
        System.out.println("destroy()");
    }
}

//一般池对象有什么特点？
//1.在JVM内存会开辟一块相对较大的空间
//2.在这块空间中存储一些对象 （思考基于什么结构进行存储--数组，链表，散列表）
//3.基于“享元模式”设计思想实现内存中对象的可重用性

//此时，我们再去运行启动类，检测ObjectPool对象是否创建了，假如没有创建，说明延迟加载生效了
//注意：延迟加载并不是延迟对类加载，而是再启动时，暂时不创建类的实例。加入想要看一下内存中的类是够被夹在了，
//可以通过JVM参数进行检测，参数-XX:TraceClassLoading